package com.example.jetpacktest.activity.material_design

import android.os.Bundle
import android.util.Log
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.jetpacktest.R
import com.example.jetpacktest.adapter.DiffUtilsTest001Adapter
import com.example.jetpacktest.layout_manager.WrapContentLinearLayoutManager

class DiffUtilTest001: AppCompatActivity() {



    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_diff_util_test001)
        val btnChange = findViewById<Button>(R.id.btn_change)
        val recyclerView = findViewById<RecyclerView>(R.id.recycler_view)
        val datas = mutableListOf<String>()
        for(i in 1..3){
            datas.add("item $i")
        }
        val adapter = DiffUtilsTest001Adapter(datas, this)
        recyclerView.adapter = adapter
        recyclerView.layoutManager = LinearLayoutManager(this)


        val newDatas = mutableListOf<String>()
        datas.forEach { str ->
            newDatas.add(str)
        }
        var index = 1000
        btnChange.setOnClickListener {
            val temp = "new item ${index++}"
            newDatas.add(temp)
            adapter.datas = newDatas
            //理论上应该计算从上一次更改以来的更改
            //如果计算的不是从上一次更改以来的更改，则将dispatchUpdatesTo()发送到adapter，会有问题
            //比如报Inconsistency detected Invalid view holder adapter position这个错误
            val res = DiffUtil.calculateDiff(MyDiffCallback(datas, newDatas), false)
            res.dispatchUpdatesTo(adapter)

            //也加入到datas，免得下次点击时，datas和newDatas差距过大，刷新的内容过大
            //不加进去还会造成 Inconsistency detected Invalid view holder adapter position这个bug
            //新旧内容的差距过大会造成 Inconsistency detected Invalid view holder adapter position这个bug
            datas.add(temp)
        }
    }


    class MyDiffCallback(private val oldList: MutableList<String>, private val newList: MutableList<String>): DiffUtil.Callback(){

        private val TAG: String = this.javaClass.simpleName

        override fun getOldListSize(): Int {
            return oldList.size
        }

        override fun getNewListSize(): Int {
            return newList.size
        }


        /**
         * 比较item对象是否相同，也就是是否是同一个对象
         * 对象是否相同是自定义的（根据自己的业务逻辑来），
         * 比如说，对某个用户对象来说，可以根据id来判断用户对象是否相同，而不是java中的根据内存地址来判断
         * 下面例子使用的则是根据对象的内存地址来判断对象是否相同
         */
        override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
            val isSame = oldList[oldItemPosition] === newList[newItemPosition]
            Log.d(TAG, "areItemsTheSame...isSame = ${isSame}......${oldList[oldItemPosition]}.......${newList[newItemPosition]}")
            return isSame
        }

        /**
         * 比较对象的内容是否相同
         */
        override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
            val isContentSame = oldList[oldItemPosition] == newList[newItemPosition]
            Log.d(TAG, "areContentsTheSame...isContentSame = $isContentSame....${oldList[oldItemPosition]}....${newList[newItemPosition]}")
            return isContentSame
        }

    }


}